package com.itlong.cloud.propertyapp.service;

import com.itlong.cloud.POJO.DTO.app.property.app.PropertyAppDeviceInfoDTO;
import com.itlong.cloud.POJO.DTO.app.property.app.PropertyAppFeedbackInfoDTO;
import com.itlong.cloud.POJO.PO.PropertyRolePO;
import com.itlong.cloud.POJO.PO.PropertyUserInfoPO;
import com.itlong.cloud.POJO.VO.MessageVO;
import com.itlong.cloud.POJO.VO.app.AppGetQrcodeVO;
import com.itlong.cloud.POJO.VO.app.property.AppGetHouseholdCheckVO;
import com.itlong.cloud.POJO.VO.app.property.app.PropertyAppUserProjectInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyUserCacheVO;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业app用户信息业务处理接口
 * </desc>
 *
 * @createDate2019/12/25
 **/
public interface IPropertyAppUserInfoService {

    /**
     * <desc>
     *      从缓存中读取用户信息
     * </desc>
     *
     * @param token
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/25
     */
    PropertyUserCacheVO retrieve(String token);

    /**
     * <desc>
     *      获取住户审核列表
     * </desc>
     *
     * @param projectId 项目编号
     * @return List<AppGetHouseholdCheckVO> 住户审核信息集
     * @Author Juguang.S
     * @createDate  2019/12/30
     */
    List<AppGetHouseholdCheckVO> getHoldAuditList(String projectId);

    /**
     * <desc>
     *      住户审核通过
     * </desc>
     *
     * @param projectId 项目编号
     * @param auditId   审核通过信息ID
     * @param type    1审核通过 2审核拒绝
     * @return
     * @Author Juguang.S
     * @createDate  2019/12/30
     */
    Integer agreeHoldAudit(String projectId,String auditId,String type);

    /**
     * <desc>
     *      用户登录验证
     * </desc>
     *
     * @param param
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/30
     */
    PropertyUserInfoPO getPropertyUserInfo(Map<String, Object> param) throws Exception;

    /**
     * <desc>
     *      获取登录用户的项目列表
     * </desc>
     *
     * @param userId
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/31
     */
    List<PropertyAppUserProjectInfoVO> getProjectListByUserId(String userId) throws Exception;

    /**
     * <desc>
     *      更改密码
     * </desc>
     *
     * @param params
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/31
     */
    Integer updatePropertyUserPassword(Map<String, Object> params) throws Exception;

    /**
     * <desc>
     *      获取物业用户二维码
     * </desc>
     *
     * @param projectId 项目编号
     * @param userId 用户编号
     * @return AppGetQrcodeVO 返回app实体类
     * @Author Juguang.S
     * @createDate  2020/01/03
     */
    AppGetQrcodeVO getPropertyAppUserQRcode(String projectId,String userId) throws Exception;

    /**
     * <desc>
     *      处理物业用户未注册sip账号及未向灵云注册等问题
     * </desc>
     *
     * @param type 1为物业APP登录时调用 type 2为物业平台绑定手机号时调用
     * @Author Juguang.S
     * @createDate  2020/01/08
     */
    void savePropertyUserSipInfo (PropertyUserInfoPO userInfoPO,String projectId,Integer type) throws Exception;

    /**
     * <desc>
     *      初始化 物业项目人员类型表中的基础数据 只调取一次
     * </desc>
     *
     * @author Jugaung.S
     * @createDate 2021/04/12
     */
    void modifyPropertyUserTypeData();

    /**
     * <desc>
     *      退出登录
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/9
     */
    boolean loginOut(String userId) throws Exception;

    /**
     * <desc>
     *      物业APP用户上传设备排序
     * <desc/>
     *
     * @param propertyAppDeviceInfoDTO 设备排序相关数据
     * @return
     * @author Juguang.S
     * @createDate 2020-01-09
     */
    Integer upLoadAllSort(PropertyAppDeviceInfoDTO propertyAppDeviceInfoDTO) throws Exception;

    /**
     * <desc>
     *      物业APP用户上传组设备排序
     * <desc/>
     *
     * @param propertyAppDeviceInfoDTO 组设备排序相关数据
     * @return
     * @author Juguang.S
     * @createDate 2020-01-09
     */
    Integer deviceGroupSort(PropertyAppDeviceInfoDTO propertyAppDeviceInfoDTO) throws Exception;

    /**
     * <desc>
     *      更改头像
     * </desc>
     *
     * @param params 更新参数
     * @return
     * @Author Zhu.yj
     * @createDate 2020/1/10
     */
    Integer updatePhoto(Map<String, Object> params) throws Exception;

    /**
     * <desc>
     *      登陆成功缓存用户
     * </desc>
     *
     * @param propertyUserInfoPO 物业用户信息PO
     * @param loginDevice 登录设备
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/14
     */
    Map<String, Object> loginCacheUser(PropertyUserInfoPO propertyUserInfoPO,String loginDevice) throws Exception;

    /**
     * <desc>
     *      获取用户完整通行记录
     * </desc>
     *
     * @param projectId 项目id
     * @param pageIndex 页数
     * @param userId 用户id
     * @return 分页通行记录
     * @Author Zhu.yj
     * @createDate  2020/1/14
     */
    Map<String, Object> getPassRecordPage(String projectId,String pageIndex,String userId) throws Exception;

    /**
     * <desc>
     *      保存反馈信息
     * </desc>
     *
     * @param propertyAppFeedbackInfoDTO 物业app反馈信息DTO
     * @return 受影响行数
     * @Author Zhu.yj
     * @createDate  2020/1/15
     */
    Integer saveFeedback(PropertyAppFeedbackInfoDTO propertyAppFeedbackInfoDTO) throws Exception;

    /**
     * <desc>
     *      查询历史反馈信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @param pageNum 页码
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/15
     */
    Map<String,Object> getHistoryFeedback(String userId, String projectId,String pageNum) throws Exception;

    /**
     * <desc>
     *      上传常用楼层
     * </desc>
     *
     * @param projectId       项目编号
     * @param deviceUnique    设备序列号
     * @param loadDeviceOrder 常用楼层名称
     * @param userId 用户id
     * @return 1成功，0失败
     * @author Juguang.S
     * @createDate 2020/01/15
     */
    Integer uploadChoiceFloor(String projectId, String deviceUnique, String loadDeviceOrder, String userId) throws Exception;

    /**
     * <desc>
     *      检查当前账号是否被锁定
     * </desc>
     *
     * @param accountNo 登录账号
     * @return
     * @Author Zhu.yj
     * @createDate  2020/2/27
     */
    MessageVO getPropertyAppAccountLockDetail(String accountNo) throws Exception;

    /**
     * <desc>
     *      物业app登录错误处理类
     * </desc>
     *
     * @param accountNo 登录账号
     * @return
     * @Author Zhu.yj
     * @createDate  2020/2/27
     */
    MessageVO propertyAppLoginErrorHandler(String accountNo) throws Exception;

    /**
     * <desc>
     *      获取物业角色详细信息
     * </desc>
     *
     * @param roleId 角色id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/3/2
     */
    List<PropertyRolePO> getPubTypeByRole(String roleId) throws Exception;

    /**
     * <desc>
     *      根据userId获取第三方token
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/3/2
     */
    String getUserClientToken(String userId) throws Exception;

    /**
     * <desc>
     *      物业APP用户设置分组名称
     * <desc/>
     *
     * @param propertyAppDeviceInfoDTO 分组ID
     * @return
     * @author Juguang.S
     * @createDate 2020-01-09
     */
    Integer setDeGroupName(PropertyAppDeviceInfoDTO propertyAppDeviceInfoDTO) throws Exception;

    /**
     * <desc>
     *      根据手机号获取物业用户信息
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2020/3/12
     */
    PropertyUserInfoPO getByAccount(String phoneNo) throws Exception;

    /**
     * <desc>
     *      更新用户当前项目id
     * </desc>
     *
     * @param projectId 项目id
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/3/16
     */
    Integer updateCurrentProjectId(String projectId, String userId) throws Exception;

    /**
     * <desc>
     *      根据deviceUnique查询居住楼层集合使用于物业APP
     * </desc>
     *
     * @param deviceUnique 设备唯一码
     * @return
     * @Author Juguang.S
     * @createDate  2020/04/16
     */
    List<String> getLiveFloorByDeviceUnique(String deviceUnique);
}
